﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;

namespace DBConnect
{
    public class CommandGuias
    {
        
        #region Guias

        /// <summary>
        /// Grava a guia no BD
        /// </summary>
        /// <param name="local">Diretório em que foi gravada a guia</param>
        /// <param name="IDLote">Identificação do Lote da Guia</param>
        /// <param name="numeroGuia">numero da nova Guia a ser inserida</param>
        public static void gravaGuia(string local, Int64 IDLote, string numeroGuia)
        {          
                string query = "INSERT INTO guia (numeroGuia, [local], IDLote, dataEmissao) " +
                    "VALUES ('" + numeroGuia + "', '" + local + "', " + IDLote + ",'" + DateTime.Now.ToString("dd/MM/yyyy") + "')";
                Connect.executa(query, "");
        }

        public static DataTable buscaGuia(string numeroGuia, long IDLote)
        {
            
            string query = "SELECT [local], cancelada, dataEmissao, glosa, reapresentada, numeroGuiaOperadora " +
                            "WHERE IDlote = " + IDLote + " AND numeroGuia = '" + numeroGuia + "'";
            return Connect.seleciona(query).Tables[0];
        }

        /// <summary>
        /// Busca Guias através da Identificação do Lote
        /// </summary>
        /// <param name="IDLote">Identificação do Lote</param>
        /// <returns>numeroGuia, local, enviada</returns>
        public static DataTable buscaGuiasLote(long IDLote)
        {
            
            string query = "SELECT numeroGuia, [local], cancelada, dataEmissao, glosa, reapresentada, numeroGuiaOperadora  " +
                "FROM guia " +
                "WHERE IDLote = " + IDLote;
            return Connect.seleciona(query).Tables[0];
        }

        public static DataTable buscaGuiasLote(long IDLote, long tipoSolicCod)
        {
            
            string query = "SELECT a.numeroGuia, a.[local], a.cancelada, a.dataEmissao, a.glosa, " +
                "a.reapresentada, a.numeroGuiaOperadora, c.demonstrativoCod " +
                "FROM ((guia a " +
                "LEFT OUTER JOIN LoteGuias b ON a.IDLote = b.ID) " +
                "LEFT OUTER JOIN (SELECT TOP 1 demonstrativoCod, loteID " +
                                    "FROM DemonstrativoRetorno " +
                                    "WHERE (tipoSolic_Cod = " + tipoSolicCod + ") " +
                                    "ORDER BY SequencialTransacao DESC) c ON b.ID = c.loteID) " +
                "WHERE (a.IDLote = " + IDLote + ")";
            return Connect.seleciona(query).Tables[0];
        }

        /// <summary>
        /// Busca Guias da Operadora com a qual o Prestador Trabalha
        /// </summary>
        /// <param name="codPrestador">Código do Prestador</param>
        /// <param name="regANS">regANS da Operadora</param>
        /// <returns>numeroGuia, [local], cancelada, dataEmissao, glosa, reapresentada, IDLote, numeroGuiaOperadora</returns>
        public static DataTable buscaGuiasOperadora(Int64 codPrestador, string regANS)
        {
            
            string query = "SELECT numeroGuia, [local], cancelada, dataEmissao, glosa, reapresentada, IDLote, numeroGuiaOperadora " +
                "FROM guia INNER JOIN LoteGuias ON guia.IDLote = LoteGuias.ID " +
                "WHERE LoteGuias.regANS = '" + regANS + "' AND LoteGuias.codPrestador = " + codPrestador;
            return Connect.seleciona(query).Tables[0];
        }

       /* /// <summary>
        /// Busca uma guia pelo local dela
        /// </summary>
        /// <param name="local">Path onde se encontra a guia</param>
        /// <returns>Número, dataEmissao e IDLote da Guia</returns>
        public static DataTable buscaGuiaLocal(string local)
        {
            
            string query = "SELECT numeroGuia, dataEmissa, IDLote " +
                "FROM guia " +
                "WHERE [local] = '" + local + "'";
            return Connect.seleciona(query).Tables[0];
        }*/

        /// <summary>
        /// Marca a Guia como Cancelada
        /// </summary>
        /// <param name="numeroGuia">Número da Guia a ser Cancelada</param>
        public static void cancelaGuia(string numeroGuia, long IDLote)
        {
            
            string query = "UPDATE guia SET cancelada = True " +
                            "WHERE IDlote = " +IDLote+ " AND numeroGuia = '"+numeroGuia+"'";
            Connect.executa(query, "");
        }

        /// <summary>
        /// Marca a Guia como Glosada
        /// </summary>
        /// <param name="numeroGuia">numero da Guia a ser Glosada</param>
        /// <param name="IDLote">lote da Guia a ser Glosada</param>
        public static void glosaGuia(string numeroGuia, long IDLote)
        {
            
            string query = "UPDATE guia SET glosa = True " +
                            "WHERE IDlote = " + IDLote + " AND numeroGuia = '" + numeroGuia + "'"; ;
            Connect.executa(query, "");
        }

        /// <summary>
        /// Marca a Guia como Reapresentada
        /// </summary>
        /// <param name="numeroGuia">Número da Guia que foi Reapresentada</param>
        public static void reapresentaGuia(string numeroGuia, long IDLote)
        {
            
            string query = "UPDATE guia SET reapresentada = True " +
                            "WHERE IDlote = " + IDLote + " AND numeroGuia = '" + numeroGuia + "'";
            Connect.executa(query, "");
        }

        /// <summary>
        /// Verifica se o Número da Guia ja existe
        /// </summary>
        /// <param name="ID">ID do Prestador</param>
        /// <param name="regANS">regANS da Operadora</param>
        /// <param name="numeroGuia">Número da Guia a ser Verificada</param>
        /// <returns>Quantidade de guias encontrada com o mesmo número</returns>
        public static int verificaNumeroGuia(Int64 ID, string regANS, string numeroGuia)
        {
            
            string query = " SELECT guia.numeroGuia, Operadora.regANS, Prestador.ID, LoteGuias.ID AS loteGuia " +
            " FROM (((LoteGuias INNER JOIN Prestador ON LoteGuias.codPrestador = Prestador.ID) INNER JOIN " +
            " Operadora ON LoteGuias.regANS = Operadora.regANS) LEFT OUTER JOIN guia ON guia.IDLote = LoteGuias.ID) " +
            " WHERE(Prestador.ID = " + ID + ") AND (Operadora.regANS = '" + regANS + "') AND (guia.numeroGuia = '" + numeroGuia + "')";
            return Connect.seleciona(query).Tables[0].Rows.Count;
        }

        public static void removeGuia(Int64 IDLote, string numeroGuia)
        {
            
            string query = " DELETE FROM guia " + " WHERE IDlote = " + IDLote + " AND numeroGuia = '" + numeroGuia + "'";
            Connect.executa(query, "");
        }

        #endregion

        #region Lote de Guias
     
        

        #endregion

        #region Guias Outras Despesas

        /// <summary>
        /// Insere no BD a Guia de Outras Despesas
        /// </summary>
        /// <param name="numeroGuia">Numero da GuiaPai de Outras Despesas</param>
        /// <param name="local">Path da Guia de Outras Despesas</param>
        public static void insereOutrasDespesas(string numeroGuia, string local, long idLote)
        {
            
            string query = "INSERT INTO guiaOutrasDespesas([local],numeroGuia,IDLote) " +
                " VALUES ('" + local + "', '" + numeroGuia + "'," + idLote + ")";
            Connect.executa(query, "");
        }

        /// <summary>
        /// Busca Todas as Guia de Outras Despesas relacionadas ao Prestador e Operadora Escolhidos
        /// </summary>
        /// <param name="ID">ID do Prestador</param>
        /// <param name="regANS">regANS da Operadora</param>
        /// <returns>guiaOutrasDespesas.[local], guiaOutrasDespesas.numeroGuia, guiaOutrasDespesas.IDLote, guiaOutrasDespesas.ID</returns>
        public static DataTable buscaOutrasDespesas(long codPrestador, string regANS)
        {
            
            string query = " SELECT guiaOutrasDespesas.[local], guiaOutrasDespesas.numeroGuia, guiaOutrasDespesas.IDLote, guiaOutrasDespesas.ID " +
                "FROM ((guia INNER JOIN LoteGuias ON guia.IDLote = LoteGuias.ID) INNER JOIN " +
                "guiaOutrasDespesas ON guia.numeroGuia = guiaOutrasDespesas.numeroGuia AND guia.IDLote = guiaOutrasDespesas.IDLote) " +
                "WHERE (LoteGuias.codPrestador = " + codPrestador + ") AND (LoteGuias.regANS = '" + regANS + "')";
            return Connect.seleciona(query).Tables[0];
        }
        
        /// <summary>
        /// Busca dados das Guias Outras Despesas da guiaPai selecionada
        /// </summary>
        /// <param name="numeroGuia">Numero da GuiaPai de Outras Despesas</param>
        /// <returns>Todas as Guias Outras Despesas da GuiaPai</returns>
        public static DataTable buscaOutrasDespesasGuia(string numeroGuia, long idLote)
        {
            
            string query = " SELECT [local], ID " +
            "FROM guiaOutrasDespesas " + 
            "WHERE numeroGuia = '" + numeroGuia + "' AND IDLote = " + idLote;
            return Connect.seleciona(query).Tables[0];
        }  
       
       public static void removeOutrasDespesas(Int64 IDGuia)
       {            
            string query = " DELETE ID " + " FROM guiaOutrasDespesas " +
                 " WHERE ID = " + IDGuia + " ";            
            Connect.executa(query, "");
        }

#endregion
    }

}
